using System;
using System.Collections.Generic;
using System.Text;

using Sinacor.Servico.Bovespa.Ordens;
using Sinacor.Infra.Service.Data;
using Sinacor.Infra.Service.Security.Authorization;
using System.Data.Common;
using System.Data;
using Sinacor.Servicos.Comum.Util.SGBD;

namespace Sinacor.Servico.Bovespa.Ordens.ResourceAccess
{
    public class Mercado : BaseResourceAccess
    {
        public Mercado()
            : base(AuthorizationContext.Current.CompanyId) 
        {
        
        }
		public bool VerificarExistenciaMercado(BusinessEntity.Mercado request)
		{
			DbCommand dbCommand;
			Object retorno;
			StringBuilder sql=new StringBuilder();

			if (request == null)
				return false;

			sql.Append("SELECT 1 FROM TBOMERCADO WHERE CD_ALMERC = :tipoMercado");
			dbCommand = this.DataBase.GetSqlStringCommand(sql.ToString());

			this.DataBase.AddInParameter(
                dbCommand, "tipoMercado", DbType.AnsiString, 
				EnumToString(request.TipoMercado)
            );

			retorno = this.DataBase.ExecuteScalar(dbCommand);

			if (retorno == null)
				return false;
			else
				return true;

		}
 		
 		/// <summary>
        /// Historico:
        /// Data : 26/12/2007
        /// Autor: Ludmilla Modesto 
        /// Obs.: Implementado. Retorna o mercado
        /// 
        /// Data:28/01/2008 16:48
        /// Autor:Dmilanez.7comm
        /// Obs:
        /// recuperar tambem o codigo do mercado
        /// </summary>
        /// <returns></returns>
        public List<BusinessEntity.Mercado> ConsultarMercados()
        {
            BusinessEntity.Mercado beMercado = null;
            List<BusinessEntity.Mercado> response = new List<BusinessEntity.Mercado>();

            StringBuilder builder = new StringBuilder();

            builder.AppendLine("SELECT CD_NRMERC,CD_ALMERC, DS_MERCADO ");
            builder.AppendLine("FROM TBOMERCADO ");
            builder.AppendLine("ORDER BY DS_MERCADO ");

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(builder.ToString()))
            {
                IDataReader readerMercado = this.DataBase.ExecuteReader(dbCommand);

                while (readerMercado.Read())
                {
                    beMercado = new BusinessEntity.Mercado();
                    beMercado.Codigo = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorInt32(readerMercado.GetValue(0));
                    beMercado.TipoMercado =StringToEnum(readerMercado.GetString(1)).Value;
                    beMercado.Descricao = Sinacor.Servicos.Comum.Util.SGBD.Funcoes.BDValorString(readerMercado[2]);
                    response.Add(beMercado);
                }

                readerMercado.Close();
            }

            return (response);
        }

        ///<sumary>
        /// Converte Tipo de Mercado de String para Enum
        /// Data: 11/12/2007
        /// Autor: Eduarddo Sertorio
        /// Observacoes: Criacao do enum
        /// 
        /// Data:28/01/2008 16:50
        /// Autor:Dmilanez.7comm
        /// Obs:
        /// Alterado de forma a conter o mercado BOX
        ///<sumary>
        public static BusinessEntity.Enum.TipoMercado? StringToEnum(string value)
        {
            BusinessEntity.Enum.TipoMercado? retorno;
            switch (value)
            {
                case "VIS":
                    retorno = BusinessEntity.Enum.TipoMercado.Vista;
                    break;
                case "OPC":
                    retorno = BusinessEntity.Enum.TipoMercado.OpcaoCompra;
                    break;
                case "OPV":
                    retorno = BusinessEntity.Enum.TipoMercado.OpcaoVenda;
                    break;
                case "EOC":
                    retorno = BusinessEntity.Enum.TipoMercado.ExercicioOpcaoCompra;
                    break;
                case "EOV":
                    retorno = BusinessEntity.Enum.TipoMercado.ExercicioOpcaoVenda;
                    break;
                case "FRA":
                    retorno = BusinessEntity.Enum.TipoMercado.Fracionario;
                    break;
                case "EST":
                    retorno = BusinessEntity.Enum.TipoMercado.Estruturado;
                    break;
                case "LEI":
                    retorno = BusinessEntity.Enum.TipoMercado.Leilao;
                    break;
                case "TER":
                    retorno = BusinessEntity.Enum.TipoMercado.Termo;
                    break;
                case "LNC":
                    retorno = BusinessEntity.Enum.TipoMercado.LeilaoNaoCotados;
                    break;
                case "FUT":
                    retorno = BusinessEntity.Enum.TipoMercado.Futuro;
                    break;
                case "VFU":
                    retorno = BusinessEntity.Enum.TipoMercado.VencimentoFuturo;
                    break;
                case "BOX":
                    retorno = BusinessEntity.Enum.TipoMercado.BOX;
                    break;
                case "IER":
                    retorno = BusinessEntity.Enum.TipoMercado.IntegralizacaoResgateCotas;
                    break;
                case "CET":
                    retorno = BusinessEntity.Enum.TipoMercado.CotasETF;
                    break;
                default:
                    retorno = null;
                    break;
            }
            return retorno;
        }

        ///<sumary>
        /// Converte Tipo de Mercado de Enum para String
        /// Data: 11/12/2007
        /// Autor: Eduarddo Sertorio
        /// Observacoes: Criacao do enum
        /// 
        /// Data:28/01/2008 16:50
        /// Autor:Dmilanez.7comm
        /// Obs:
        /// Alterado de forma a conter o mercado BOX
        ///<sumary>
        public static string EnumToString(BusinessEntity.Enum.TipoMercado value)
        {
            string retorno;
            switch (value)
            {
                case BusinessEntity.Enum.TipoMercado.Vista:
                    retorno = "VIS";
                    break;
                case BusinessEntity.Enum.TipoMercado.OpcaoCompra:
                    retorno = "OPC";
                    break;
                case BusinessEntity.Enum.TipoMercado.OpcaoVenda:
                    retorno = "OPV";
                    break;
                case BusinessEntity.Enum.TipoMercado.ExercicioOpcaoCompra:
                    retorno = "EOC";
                    break;
                case BusinessEntity.Enum.TipoMercado.ExercicioOpcaoVenda:
                    retorno = "EOV";
                    break;
                case BusinessEntity.Enum.TipoMercado.Fracionario:
                    retorno = "FRA";
                    break;
                case BusinessEntity.Enum.TipoMercado.Estruturado:
                    retorno = "EST";
                    break;
                case BusinessEntity.Enum.TipoMercado.Leilao:
                    retorno = "LEI";
                    break;
                case BusinessEntity.Enum.TipoMercado.Termo:
                    retorno = "TER";
                    break;
                case BusinessEntity.Enum.TipoMercado.LeilaoNaoCotados:
                    retorno = "LNC";
                    break;
                case BusinessEntity.Enum.TipoMercado.Futuro:
                    retorno = "FUT";
                    break;
                case BusinessEntity.Enum.TipoMercado.VencimentoFuturo:
                    retorno = "VFU";
                    break;
                case BusinessEntity.Enum.TipoMercado.BOX:
                    retorno = "BOX";
                    break;
                case BusinessEntity.Enum.TipoMercado.IntegralizacaoResgateCotas:
                    retorno = "IER";
                    break;
                case BusinessEntity.Enum.TipoMercado.CotasETF:
                    retorno = "CET";
                    break;
                default: //BusinessEntity.Enum.TipoMercado.Indefinido
                    retorno = "";
                    break;
            }
            return retorno;
        }

        public static string EnumToString(BusinessEntity.Enum.TipoMercado? value)
        {
            if (value.HasValue)
                return EnumToString(value.Value);
            else
                return null;
        }
    }
}
